/***********************
 *	I2C.c
 *
 *	Gebruikte Pinnen:
 *	pin 2 en 3: worden geburikt voor I2C(accelerometer).
 * *********************/
#include "I2C.h"
#include "vic.h"
#include "LPC214x.h"
#include "leds.h"

extern  void __enable_interrupts();
extern  void __disable_interrupts();

//extern  void IRQHandler();

extern int xyzcount;
extern int arraycount;
extern int I2Cstatus;
extern  char xwaarde, zwaarde, ywaarde;

void I2C_init(void) //Initialisate I2C
{
/***********************
 *	Gemaakt door : Jeroen
 *	Functies : VicSetup(unsigned int intHandler ,char intType, char intSource, char intVector);
 *	Gebruikte pinnen : van hearder sv1: pin 2 voor de klok en pin 3 voor data.
 *	Beschrijving : hier wordt de vector interupt, en de gebruikte pinnen (2 en 3) en de clockrate ingesteld.
 *********************/
	__disable_interrupts();

	VicSetup((unsigned)I2C_Isr,IRQ,9,2);

	PINSEL0 |= 0x50;
	I2C0SCLH = clockrate;
	I2C0SCLL = clockrate;

	__enable_interrupts();
}

void I2C_start(void)
{
/***********************
 *	Gemaakt door : Jeroen
 *
 *	Functies : I2C_Isr();
 *	Gebruikte pinnen :
 *	Beschrijving : stelt de register in de accelerometer.
 *	het staat measurement mode met een detectie van 4g.
 *********************/

	I2C0CONSET = 0x60;
	while(!I2Cstatus); //Wacht tot ISR helemaal klaar is
	while(!I2Cstatus); //Wacht tot ISR helemaal klaar is
	I2C0CONCLR = 0xff;
}

void I2C_lees(void)
{
/***********************
 *	Gemaakt door : Jeroen
 *	Functies : I2C_Isr();
 *	Gebruikte pinnen : n.v.t.
 *	Beschrijving : hier wordt aangegeven dat de accelerometer uitgelezen moet worden.
 *	in de I2C_Isr(); wordt het protocol doorlopen.
 *	hierbij wordt de 8 bits waardes van x, y en z opgehaald.
 *
 *********************/
	I2Cstatus = 1;
	I2C0CONSET = 0x60;
	while(I2Cstatus==1); //Wacht tot ISR helemaal klaar is
	while(I2Cstatus==1); //Wacht tot ISR helemaal klaar is
	I2C0CONCLR = 0xff;
}


void I2C_Isr(void)
{
/***********************
 *	Gemaakt door : Jeroen & Freek
 *	Functies : n.v.t.
 *	Gebruikte pinnen : n.v.t.
 *	Beschrijving : hier wordt het protocol doorlopen van I2C.
 *********************/
	__disable_interrupts();
	unsigned int st,st2;
	st = I2C0STAT; //Status van I2C

	char waddr=0x3A; //Device Adress met write bit ('0')
	char raddr=0x3B; //Device ADress met read bit ('0')

	char array[15] = {0x0c,0x00,0x38,0x00,0x00,0x00,
	0x09,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //Bevat de 15 registers voor de initialisatie

		switch(st)
		{
			case 0x08: //Start bit ontvangen, stuur write address.
				I2C0CONCLR = 0x20;
				I2C0DAT = waddr;
				break;
			case 0x10: //Repeated start, stuur read address, switch naar Master Receiver.
				I2C0DAT = raddr;
				break;
			case 0x18: //Write address ontvangen, stuur data
				if(I2Cstatus==0) I2C0DAT = 0x10; //Bij initialisatie vanaf register 0x10
				else I2C0DAT = 0x06; //Bij uitlezen vanaf register 0x06
				break;
			case 0x28: //Data ontvangen, ACK terug. Ga hele arrray van registers langs.
				if(I2Cstatus!=0) I2C0CONSET = 0x20; //Bij uitlezen, repeated start.
				else //Else, dus initialisatie.
				{
					if(arraycount==15) //Array doorgestuurd, end initialisatie.
					{
						I2C0CONSET = 0x10;
						I2Cstatus = 1;
					}
					else
					{
						I2C0DAT = array[arraycount]; //Stuur de 15 registers voor initialisatie door
						arraycount++;
					}
				}
				break;
			case 0x40: //Read adress ontvangen, zet ACK hoog start laag en receive data
				I2C0CONSET = 0x04;
				I2C0CONCLR = 0x20;
				break;
			case 0x50: //Data ontvangen, ACK terug, kijk welke data er ontvangen is met xyzcount.
				if(xyzcount == 0)
				{
					xwaarde = I2C0DAT;
					I2C0CONCLR = 0x20;
					xyzcount++; //Volgende is Y-waarde.
					break;
				}
				else
				{
					ywaarde = I2C0DAT;
					I2C0CONCLR = 0x24; //Stuur NACK terug.
					xyzcount--; //Zet xyzcount terug.
					break;
				}
			case 0x58: //Data ontvangen, NACK terug, end lezen.
				zwaarde = I2C0DAT;
				I2C0CONSET = 0x10; //Stop bit set.
				I2C0CONCLR = 0x20;
				I2Cstatus = 2; //Klaar met uitlezen.
				break;
			default:
				LED_put(0xff);   // zet alle led's aan.
				I2C0CONSET = 0x10; //Stop bit set.
				I2Cstatus = 2; //Klaar met uitlezen.
				break;
		}

	st2=st;
	I2C0CONCLR = 0x8; //Reset I2C interrupt flag.
	__enable_interrupts();
}

